package luanvan.app.foodnote.library;

import java.util.Timer;
import java.util.TimerTask;

import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;

public class MyLocation {

	Timer timer1;
	LocationManager lm;
	LocationResult locationResult;
	boolean gps_enable = false;
	boolean network_enable = false;
	
	public boolean getLocation(Context context, LocationResult result){
		// Use LocationResult callback class to pass location value from MyLocation to user code.
		locationResult = result;
		if(lm == null)
			lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
		//exceptions will be thrown if provider is not permitted.
		try {
			gps_enable = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
		} catch(Exception ex){

		}
		try {
			network_enable = lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
		} catch(Exception ex){
			
		}
		
		// Don't start listeners if no provider is enabled
		if(!gps_enable && !network_enable){
			return false;
		}
		if(gps_enable)
			lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListenerGps);
		if(network_enable)
			lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListenerNetwork);
		timer1 = new Timer();
		timer1.schedule(new GetLastLocation(), 10000);
		
		return true;
	}
	
	LocationListener locationListenerGps = new LocationListener() {
		
		@Override
		public void onStatusChanged(String provider, int status, Bundle extras) {
			// TODO Auto-generated method stub
			
		}
		
		@Override
		public void onProviderEnabled(String provider) {
			// TODO Auto-generated method stub
			
		}
		
		@Override
		public void onProviderDisabled(String provider) {
			// TODO Auto-generated method stub
			
		}
		
		@Override
		public void onLocationChanged(Location location) {
			timer1.cancel();
			locationResult.gotLocation(location);
			lm.removeUpdates(this);
			lm.removeUpdates(locationListenerNetwork);
		}
	};
	
	LocationListener locationListenerNetwork = new LocationListener() {
		
		@Override
		public void onStatusChanged(String provider, int status, Bundle extras) {
			// TODO Auto-generated method stub
			
		}
		
		@Override
		public void onProviderEnabled(String provider) {
			// TODO Auto-generated method stub
			
		}
		
		@Override
		public void onProviderDisabled(String provider) {
			// TODO Auto-generated method stub
			
		}
		
		@Override
		public void onLocationChanged(Location location) {
			timer1.cancel();
			locationResult.gotLocation(location);
			lm.removeUpdates(this);
			lm.removeUpdates(locationListenerGps);
		}
	};
	
	public void cancelTimer(){
		timer1.cancel();
		lm.removeUpdates(locationListenerGps);
		lm.removeUpdates(locationListenerNetwork);
	}
	class GetLastLocation extends TimerTask {

		@Override
		public void run() {
			lm.removeUpdates(locationListenerGps);
			lm.removeUpdates(locationListenerNetwork);
			
			Location net_loc = null, gps_loc = null;
			if(gps_enable)
				gps_loc = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
			if(network_enable)
				net_loc = lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
			//if there are both values use the latest one
			if(gps_loc != null && net_loc != null){
				if(gps_loc.getTime() > net_loc.getTime())
					locationResult.gotLocation(gps_loc);
				else
					locationResult.gotLocation(net_loc);
				return;
			}
			
			if(gps_loc != null){
				locationResult.gotLocation(gps_loc);
				return;
			}
			if(net_loc != null){
				locationResult.gotLocation(net_loc);
				return;
			}
			locationResult.gotLocation(null);
		}
		
	}
	public static abstract class LocationResult {
		public abstract void gotLocation(Location location);
	}
}
